package Klient;

import Klient.Model.MissileType;

/**
 *
 * @author Martin Strouhal
 */
public interface AbstractModel {

    /**
     * Předá příkaz Controlleru, který pošle objekt Message serveru.
     *
     * @param m Zpráva v objektu Message
     */
    public void sendMessage(Message m); //Předá sendMessage AbstractCommunicatoru

    /**
     * Metodu spouští Controller. Inicializace hry. Používá se na začátku hry.
     *
     * @param rounds Počet kol hry
     * @param shopTime Čas na nakupování (sekundy)
     * @param turnTime Čas na tah (sekundy)
     * @param startingMoney Počáteční peníze
     */
    public void init(int rounds, int shopTime, int turnTime, int startingMoney); //Úplný začátek hry

    /**
     * Metodu spouští Controller. Posune tank s daným indexem o počet metrů
     * (pixelů) po mapě.
     *
     * @param index Index tanku v poli hráčů, které model má
     * @param toMove O kolik pixelů se má posunout. Záporné číslo znamená doleva
     * @param hasParachute Jestli má při pádu použít padák. Jeden pohyb nesmí
     * způsobit více než jeden pád, musí se rozdělit na více částí
     */
    public void moveTank(int index, int toMove, boolean hasParachute);

    /**
     * Metodu spouští Controller. Tank s indexem použil lékárničku. Zvětšují
     * se mu životy.
     *
     * @param index Kolikátý tank v poli má být vyléčen lékárničkou
     */
    public void healTank(int index);

    /**
     * Metodu spouští Controller. Informace o tanku, který vystřelil. Střelba je
     * následně vykreslena.
     *
     * @param index Index střílejícího tanku v poli hráčů, které model má
     * @param missile Informace o střele
     * @param wind Síla větru při další střele
     */
    public void shoot(int index, Missile missile, int wind);

    /**
     * Metodu spouští Controller. Přeskočí hráče na tahu.
     */
    public void skipTurn(); //Hráč na tahu přeskočí kolo.

    public void goShop(); //Přejít k nákupu

    /**
     * @param index Kolikátý hráč v poli dokončil nákup
     */
    public void playerShopFinished(int index);

    /**
     * Metodu spouští Controller. Spuštění kola po nakupování.
     *
     * @param map Mapa, na které se bude hrát
     * @param startingPlayer Začínající hráč (index v poli)
     */
    public void goRound(Map map, int startingPlayer); //Přejít ke hře 

    public Tank getTank(int index); //Vrátí tank na daném místě v poli

    public Player getPlayer(int index); //Vrátí hráče na daném místě v poli

    public int getAngle(); //Vrátí úhel střely, na který (ovládající) hráč míří

    public int getPower(); //Vrátí sílu střely

    public int getWind(); //Vrátí vítr

    public int getFuel(); //Vrátí palivo

    public MissileType[] getMissileTypes(); //Vrátí všehny možné zbraně a jejich počet

    public void startClient();//Založí klienta

    public void startServer();//Založí server
}
